package com.sigmatrix.h5.utils.baidu;

import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONObject;
import com.sigmatrix.h5.enums.CoordType;
import com.sigmatrix.h5.utils.HttpClientUtils;
import com.sigmatrix.h5.utils.baidu.po.LatLngLocation;

/**
 * 
 *@ClassName: BaiduMapUtils
 *@Description: 百度地图工具类
 *@author MH
 *@date 2017年9月26日 上午10:53:15
 */
public class BaiduMapUtils {
	
	private static Logger logger = LoggerFactory.getLogger(BaiduMapUtils.class);
	
	private static final String URL = "http://api.map.baidu.com/geocoder/v2/";
	
	private static final String AK = "C7vNe3HCTp0gOE9RDZWlzjhUwnICypYC";
	/**
	 * 
	 *@Title: latAndLng2Location
	 *@Description: 经纬度转换为地点
	 *@return String
	 *@author MH
	 *@date 2017年9月26日 上午11:27:05
	 *@param coordType <p> 坐标类型<br>
	 *	目前支持的类型有 bd09ll(百度经纬度坐标)、bd09mc(百度米制坐标)、gcj02ll(国测局经纬度坐标)、wgs84ll(GPS经纬度)</p>
	 *@param location <p>经纬度坐标系，经度跟纬度用,隔开。<br>
	 *	支持批量，多个经纬度之间用|隔开。<br>
	 *	单词请求最多只能解析20组坐标系，超过20组只取前20组。<br>
	 *	如果是批量解析batch需要设置为true
	 *@param batch 如果是批量解析，需要设置true
	 *@param pois<p>是否显示位置周边的poi 0为不显示，1为显示，值为1时，默认显示周边1000米内的poi。默认值为0
	 *@param extensionsPoi <p>区别于pois参数，pois=0，不召回pois数据，但底层仍访问poi相应服务；<br>
	 *	extensions_poi=null时，底层不调用poi相关服务，可减少服务访问时延。
	 *@param extensionsRoad <p>当取值为true时，召回坐标周围最近的3条道路数据。区别于行政区划中的street参数（该参数为行政区划中的街道，和普通道路不对应）。
	 *@param extensionsTown <p>当取值为true时，行政区划返回乡镇级数据。默认不访问。
	 *@param radius <p>poi召回半径，允许设置区间为0-1000米，超过1000米按1000米召回
	 *@param latestAdmin <p>是否访问最新版行政区划数据，1（访问），0（不访问）
	 *@return
	 */
	public static String latAndLng2Location(CoordType coordType,String location,boolean batch,
			int pois,String extensionsPoi,boolean extensionsRoad,boolean extensionsTown,
			int radius,int latestAdmin,String outPut){
		Map<String,Object> args = new HashMap<String,Object>();
		args.put("coordtype", coordType.value);
		args.put("location", location);
		args.put("batch", batch);
		args.put("extensions_poi", extensionsPoi);
		args.put("extensions_road", extensionsRoad);
		args.put("extensions_town", extensionsTown);
		args.put("pois", pois);
		args.put("radius", radius);
		args.put("latest_admin", latestAdmin);
		args.put("ak", AK);
		args.put("output", outPut);
		String result = HttpClientUtils.getString(URL, args);
		logger.info("百度地图解析经纬度。参数{}",JSONObject.toJSONString(args));
		logger.info("百度地图解析经纬度。结果{}",result);
		return result;
	}
	
	public static String latAndLng2Location(CoordType coordType,String location,boolean batch,int latestAdmin){
		return latAndLng2Location(coordType, location, batch, 0, null, false, false, 1000, latestAdmin,"json");
	}
	
	public static String latAndLng2Location(CoordType coordType,String location,int latestAdmin){
		return latAndLng2Location(coordType, location, false, latestAdmin);
	}
	public static String latAndLng2Location(String location,boolean batch){
		return latAndLng2Location(CoordType.WGS84LL, location, batch, 1);
	}
	public static String latAndLng2Location(String location,int latestAdmin){
		return latAndLng2Location(CoordType.WGS84LL, location, latestAdmin);
	}
	
	public static String latAndLng2Location(String location){
		return latAndLng2Location(location, 1);
	}
	
	public static String latAndLng2Location(String latitude,String longitude){
		return latAndLng2Location(latitude+","+longitude);
	}
	public static String latAndLng2Location(String latitude,String longitude,CoordType coordType){
		return latAndLng2Location(coordType, latitude+","+longitude, 1);
	}
	public static void main(String[] args) {
//		String string = latAndLng2Location("30.448761","106.63161",CoordType.GCJ02LL);
//		String string = latAndLng2Location("30.780556","103.94854",CoordType.GCJ02LL);
//		String string = latAndLng2Location("22.930128","113.64619",CoordType.GCJ02LL);
//		String string = latAndLng2Location("31.151639938354492","121.81085205078125",CoordType.GCJ02LL);
//		String string = latAndLng2Location("36.10298","114.40289",CoordType.GCJ02LL);
//		String string = latAndLng2Location("44.840813","82.361275",CoordType.GCJ02LL);
		String string = latAndLng2Location("4.9E-324","4.9E-324",CoordType.GCJ02LL);
//		String string = latAndLng2Location("25.043","121.5051",CoordType.GCJ02LL);
		//
		System.out.println(string);
	}
	
	public static LatLngLocation parseLatAndLng(String latitude,String longitude){
		return JSONObject.parseObject(latAndLng2Location(latitude, longitude), LatLngLocation.class);
	}
	public static LatLngLocation parseLatAndLng(String latitude,String longitude,CoordType coordType){
		return JSONObject.parseObject(latAndLng2Location(latitude, longitude,coordType), LatLngLocation.class);
	}
}
